/**
 * 最大子矩阵
 *
 * 描述
 * 已知矩阵的大小定义为矩阵中所有元素的和。给定一个矩阵，你的任务是找到最大的非空
 * (大小至少是1 * 1)子矩阵。 比如，如下4 * 4的矩阵 0 -2 -7 0 9 2 -6 2 -4
 * 1 -4 1 -1 8 0 -2 的最大子矩阵是 9 2 -4 1 -1 8 这个子矩阵的大小是15。
 *
 * 输入描述：
 * 输入是一个N * N的矩阵。输入的第一行给出N (0 < N <= 100)。 再后面的若干行中，
 * 依次（首先从左到右给出第一行的N个整数，再从左到右给出第二行的N个整数……）给出矩阵
 * 中的N2个整数，整数之间由空白字符分隔（空格或者空行）。 已知矩阵中整数的范围都在[-127, 127]。
 *
 * 输出描述：
 * 输出最大子矩阵的大小。
 */

import java.util.Scanner;

/**
 * 这一题的主要思路就是要我们提前将 dp 前缀和数组求出来
 * 然后再枚举任意两个点之间的数, 利用 dp 数组来求出结果
 * 观察可以发现 i,j ~ a,b 之间 可以用 dp 数组的值来求
 * dp[a][b] - dp[i - 1][b] - dp[a][j - 1] + dp[i - 1][j - 1];
 * 然后求出这里面的最大值就可以了
 * 时间复杂度 : O(n ^ 4)
 * 空间复杂度 : O(n ^ 2)
 */

public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);

        int n = in.nextInt();

        int[][] nums = new int[n + 1][n + 1];

        // 前缀和数组, 之类多开辟一个 1, 免去了后面的条件判断, 天然的 0 也完美的完成了初始数组的初始化
        int[][] dp = new int[n + 1][n + 1];
        for (int i = 1; i <= n; i++) {
            for (int j = 1; j <= n; j++) {
                nums[i][j] = in.nextInt();

                //  求出前缀和
                dp[i][j] = dp[i - 1][j] + dp[i][j - 1] + nums[i][j] - dp[i - 1][j - 1];
            }
        }

        // 初始化结果
        int res = Integer.MIN_VALUE;

        // 枚举每个位置的组合
        for (int i = 1; i <= n; i++) {
            for (int j = 1; j <= n; j++) {
                for (int a = i; a <= n; a++) {
                    for (int b = j; b <= n; b++) {

                        // 这里求值
                        int x = dp[a][b] - dp[i - 1][b] - dp[a][j - 1] + dp[i - 1][j - 1];

                        // 更新最大结果
                        res = Math.max(res, x);
                    }
                }
            }
        }

        // 返回结果
        System.out.println(res);
    }
}
